`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2024/03/12 09:47:03
// Design Name: 
// Module Name: gmii_to_rgmii
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module gmii_to_rgmii(
    // FPGA传来的gmii信号发送信号
    input           gmii_tx_clk     ,// gmii的发送时钟，由FPGA提供
    input           gmii_tx_en      ,// gmii的发送数据有效信号，由FPGA提供
    input   [7:0]   gmii_tx_data    ,// gmii的发送数据，由FPGA提供

    // 发出去rgmii信号
    output          rgmii_tx_clk     ,// rgmii的发送时钟，由FPGA提供
    output          rgmii_tx_ctl     ,// rgmii的发送有效信号
    output  [3:0]   rgmii_tx_data     // rgmii的发送数据读取
);

//**********************************************
//**            main code
//**********************************************
assign rgmii_tx_clk = gmii_tx_clk; //gmii的发送时钟和rgmii的发送时钟一致

// ODDR用于将单沿数据输出为双沿数据
ODDR #(
    .DDR_CLK_EDGE   ("SAME_EDGE"    ),  // "OPPOSITE_EDGE" or "SAME_EDGE"
    .INIT           (1'b0           ),  // Initial value of Q: 1'b0 or 1'b1
    .SRTYPE         ("SYNC"         )   // Set/Reset type: "SYNC" or "ASYNC"
) ODDR_inst (
    .Q              (rgmii_tx_ctl   ),  // 1-bit DDR output
    .C              (rgmii_tx_clk   ),  // 1-bit clock input
    .CE             (1'b1           ),  // 1-bit clock enable input
    .D1             (gmii_tx_en     ),  // 1-bit data input (positive edge)
    .D2             (gmii_tx_en     ),  // 1-bit data input (negative edge)
    .R              (1'b0           ),  // 1-bit reset
    .S              (1'b0           )   // 1-bit set
);

genvar i;
generate for (i = 0; i < 4; i = i + 1)
    begin : txdata_bus
        // ODDR用于将单沿数据输出为双沿数据
        ODDR #(
            .DDR_CLK_EDGE   ("SAME_EDGE"        ),  // "OPPOSITE_EDGE" or "SAME_EDGE"
            .INIT           (1'b0               ),  // Initial value of Q: 1'b0 or 1'b1
            .SRTYPE         ("SYNC"             )   // Set/Reset type: "SYNC" or "ASYNC"
        ) ODDR_inst (
            .Q              (rgmii_tx_data[i]   ),  // 1-bit DDR output
            .C              (rgmii_tx_clk       ),  // 1-bit clock input
            .CE             (1'b1               ),  // 1-bit clock enable input
            .D1             (gmii_tx_data[i]    ),  // 1-bit data input (positive edge)
            .D2             (gmii_tx_data[4+i]  ),  // 1-bit data input (negative edge)
            .R              (1'b0               ),  // 1-bit reset
            .S              (1'b0               )   // 1-bit set
        );
    end
endgenerate
endmodule
